/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.form; import org.openide.*; import org.openide.nodes.*; import org.openide.explorer.propertysheet.editors.*; import org.netbeans.modules.form.compat2.layouts.*; import org.netbeans.modules.form.forminfo.*; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JMenuBar; import javax.swing.JComboBox; import java.util.Hashtable; /** RADVisualFormContainer represents the top-level container of the form and the form itself * during design time. * * @author Ian Formanek */ public class RADVisualFormContainer extends RADVisualContainer implements FormContainer { public static final String PROP_MENU_BAR = "menuBar"; // NOI18N public static final String PROP_FORM_SIZE_POLICY = "formSizePolicy"; // NOI18N public static final String PROP_FORM_SIZE = "formSize"; // NOI18N public static final String PROP_FORM_POSITION = "formPosition"; // NOI18N public static final String PROP_GENERATE_POSITION = "generatePosition"; // NOI18N public static final String PROP_GENERATE_SIZE = "generateSize"; // NOI18N public static final String PROP_GENERATE_CENTER = "generateCenter"; // NOI18N /** * @associates String */ public static final Hashtable encodingList = new Hashtable (); static { encodingList.put ("US-ASCII (English)", "US-ASCII"); // NOI18N encodingList.put ("UTF-8 (Compressed Unicode)", "UTF-8"); // NOI18N encodingList.put ("UTF-16 (Compressed UCS)", "UTF-16"); // NOI18N encodingList.put ("ISO-10646-UCS-2 (Raw Unicode)", "ISO-10646-UCS-2"); // NOI18N encodingList.put ("ISO-10646-UCS-4 (Raw UCS)", "ISO-10646-UCS-4"); // NOTE: no support for ISO-10646-UCS-4 yet. [from XmlReader] // NOI18N encodingList.put ("ISO-8859-1 (Latin-1, western Europe)", "ISO-8859-1"); // NOI18N encodingList.put ("ISO-8859-2 (Latin-2, eastern Europe)", "ISO-8859-2"); // NOI18N encodingList.put ("ISO-8859-3 (Latin-3, southern Europe)", "ISO-8859-3"); // NOI18N encodingList.put ("ISO-8859-4 (Latin-4, northern Europe)", "ISO-8859-4"); // NOI18N encodingList.put ("ISO-8859-5 (ASCII plus Cyrillic)", "ISO-8859-5"); // NOI18N encodingList.put ("ISO-8859-6 (ASCII plus Arabic)", "ISO-8859-6"); // NOI18N encodingList.put ("ISO-8859-7 (ASCII plus Greek)", "ISO-8859-7"); // NOI18N encodingList.put ("ISO-8859-8 (ASCII plus Hebrew)", "ISO-8859-8"); // NOI18N encodingList.put ("ISO-8859-9 (Latin-5, Turkish)", "ISO-8859-9"); // NOI18N encodingList.put ("ISO-2022-JP (Japanese)", "ISO-2022-JP"); // NOI18N encodingList.put ("Shift_JIS (Japanese, Windows)", "Shift_JIS"); // NOI18N encodingList.put ("EUC-JP (Japanese, UNIX)", "EUC-JP"); // NOI18N encodingList.put ("Big5 (Chinese, Taiwan)", "Big5"); // NOI18N encodingList.put ("GB2312 (Chinese, mainland China)", "GB2312"); // NOI18N encodingList.put ("KOI8-R (Russian)", "KOI8-R"); // NOI18N encodingList.put ("ISO-2022-KR (Korea)", "ISO-2022-KR"); // NOI18N encodingList.put ("EUC-KR (Korean, UNIX)", "EUC-KR"); // NOI18N encodingList.put ("ISO-2022-CN (Chinese)", "ISO-2022-CN"); // NOI18N encodingList.put ("EBCDIC-CP-US (EBCDIC: US)", "EBCDIC-CP-US"); // NOI18N encodingList.put ("EBCDIC-CP-CA (EBCDIC: Canada)", "EBCDIC-CP-CA"); // NOI18N encodingList.put ("EBCDIC-CP-NL (EBCDIC: Netherlands)", "EBCDIC-CP-NL"); // NOI18N encodingList.put ("EBCDIC-CP-WT (like EBCDIC-CP-US)", "EBCDIC-CP-WT"); // NOI18N encodingList.put ("EBCDIC-CP-DK (EBCDIC: Denmark)", "EBCDIC-CP-DK"); // NOI18N encodingList.put ("EBCDIC-CP-NO (EBCDIC: Norway)", "EBCDIC-CP-NO"); // NOI18N encodingList.put ("EBCDIC-CP-FI (EBCDIC: Finland)", "EBCDIC-CP-FI"); // NOI18N encodingList.put ("EBCDIC-CP-SE (EBCDIC: Sweden)", "EBCDIC-CP-SE"); // NOI18N encodingList.put ("EBCDIC-CP-IT (EBCDIC: Italy)", "EBCDIC-CP-IT"); // NOI18N encodingList.put ("EBCDIC-CP-ES (EBCDIC: Spain, Latin America)", "EBCDIC-CP-ES"); // NOI18N encodingList.put ("EBCDIC-CP-GB (EBCDIC: Great Britain)", "EBCDIC-CP-GB"); // NOI18N encodingList.put ("EBCDIC-CP-FR (EBCDIC: France)", "EBCDIC-CP-FR"); // NOI18N encodingList.put ("EBCDIC-CP-AR1 (EBCDIC: Arabic)", "EBCDIC-CP-AR1"); // NOI18N encodingList.put ("EBCDIC-CP-HE (EBCDIC: Hebrew)", "EBCDIC-CP-HE"); // NOI18N encodingList.put ("EBCDIC-CP-BE (like EBCDIC-CP-CH)", "EBCDIC-CP-BE"); // NOI18N encodingList.put ("EBCDIC-CP-CH (EBCDIC: Switzerland)", "EBCDIC-CP-CH"); // NOI18N encodingList.put ("EBCDIC-CP-ROECE (EBCDIC: Roece)", "EBCDIC-CP-ROECE"); // NOI18N encodingList.put ("EBCDIC-CP-YU (EBCDIC: Yogoslavia)", "EBCDIC-CP-YU"); // NOI18N encodingList.put ("EBCDIC-CP-IS (EBCDIC: Iceland)", "EBCDIC-CP-IS"); // NOI18N encodingList.put ("EBCDIC-CP-AR2 (EBCDIC: Urdu)", "EBCDIC-CP-AR2"); // NOI18N } protected static final String AUX_MENU_COMPONENT = "RADVisualFormContainer_MenuComponent"; // NOI18N public static final int GEN_BOUNDS = 0; public static final int GEN_PACK = 1; public static final int GEN_NOTHING = 2; /** Localized string for no menu. */ static final String NO_MENU = FormEditor.getFormBundle ().getString ("CTL_NoMenu"); private FormInfo formInfo; private Container topContainer; private Container topAddContainer; // Synthetic properties of form private RADComponent menu; private boolean menuInitialized = false; private Dimension formSize = new Dimension (FormEditor.DEFAULT_FORM_WIDTH, FormEditor.DEFAULT_FORM_HEIGHT); private Point formPosition; private boolean generatePosition = true; private boolean generateSize = true; private boolean generateCenter = true; private int formSizePolicy = GEN_NOTHING; public RADVisualFormContainer (FormInfo formInfo) { super (); this.formInfo = formInfo; topContainer = formInfo.getTopContainer (); topAddContainer = formInfo.getTopAddContainer (); } /** @return The JavaBean visual container represented by this RADVisualComponent */ public Container getContainer () { return topAddContainer; } /** Called to create the instance of the bean. Default implementation simply creates instance * of the bean's class using the default constructor. Top-level container (the form object itself) * will redefine this to use FormInfo to create the instance, as e.g. Dialogs cannot be created using * the default constructor * @return the instance of the bean that will be used during design time */ protected Object createBeanInstance () { return formInfo.getFormInstance (); } /** Called to obtain a Java code to be used to generate code to access the container for adding subcomponents. * It is expected that the returned code is either "" (in which case the form is the container) or is a name of variable * or method call ending with "." (e.g. "container.getContentPane ()."). * This implementation simply delegates to FormInfo.getContainerGenName (). * @return the prefix code for generating code to add subcomponents to this container */ public String getContainerGenName () { return formInfo.getContainerGenName (); } // ------------------------------------------------------------------------------ // Form synthetic properties public FormInfo getFormInfo () { return formInfo; } /** Getter for the Name property of the component - overriden to provide non-null value, * as the top-level component does not have a variable * @return current value of the Name property */ public String getName () { return FormEditor.getFormBundle ().getString ("CTL_FormTopContainerName"); } /** Setter for the Name property of the component - usually maps to variable declaration for holding the * instance of the component * @param value new value of the Name property */ public void setName (String value) { // noop in forms } public String getFormMenu () { if (!menuInitialized) { String menuName = (String)getAuxValue (AUX_MENU_COMPONENT); if (menuName != null) { ArrayList list = getAvailableMenus (); for (Iterator it = list.iterator (); it.hasNext ();) { RADComponent comp = (RADComponent)it.next (); if (comp.getName ().equals (menuName)) { menu = comp; break; } } } menuInitialized = true; } if (menu == null) return null; else return menu.getName (); } public void setFormMenu (String value) { setAuxValue (AUX_MENU_COMPONENT, value); if (value != null) { ArrayList list = getAvailableMenus (); for (Iterator it = list.iterator (); it.hasNext ();) { RADComponent comp = (RADComponent)it.next (); if (comp.getName ().equals (value)) { menu = comp; } } if (menu != null) { // menu with the specified name not found // set the real menu if (formInfo instanceof JMenuBarContainer) { if (menu.getBeanInstance () instanceof JMenuBar) { ((JMenuBarContainer)formInfo).setJMenuBar ((JMenuBar)menu.getBeanInstance ()); } } else if (formInfo instanceof MenuBarContainer) { if (menu.getBeanInstance () instanceof MenuBar) { ((MenuBarContainer)formInfo).setMenuBar ((MenuBar)menu.getBeanInstance ()); } } } } else { menu = null; // set the real menu if (formInfo instanceof JMenuBarContainer) { ((JMenuBarContainer)formInfo).setJMenuBar (null); } else if (formInfo instanceof MenuBarContainer) { ((MenuBarContainer)formInfo).setMenuBar (null); } } getFormManager ().fireCodeChange (); } public Point getFormPosition () { if (formPosition == null) { formPosition = topContainer.getLocation (); } return formPosition; } public void setFormPosition (Point value) { formPosition = value; // [PENDING - set on form window if in single mode] getFormManager ().fireCodeChange (); } public Dimension getFormSize () { if (formSize == null) { formSize = topContainer.getSize (); } return formSize; } public void setFormSize (Dimension value) { formSize = value; // [PENDING - set on form window if in single mode] getFormManager ().fireCodeChange (); } public boolean getGeneratePosition () { return generatePosition; } public void setGeneratePosition (boolean value) { // [PENDING - set as aux value] generatePosition = value; getFormManager ().fireCodeChange (); } public boolean getGenerateSize () { return generateSize; } public void setGenerateSize (boolean value) { // [PENDING - set as aux value] generateSize = value; getFormManager ().fireCodeChange (); } public boolean getGenerateCenter () { return generateCenter; } public void setGenerateCenter (boolean value) { // [PENDING - set as aux value] generateCenter = value; getFormManager ().fireCodeChange (); } public int getFormSizePolicy () { if (formInfo instanceof JAppletFormInfo || formInfo instanceof AppletFormInfo || formInfo instanceof JPanelFormInfo || formInfo instanceof PanelFormInfo) { return GEN_NOTHING; } return formSizePolicy; } public void setFormSizePolicy (int value) { // [PENDING - set as aux value] formSizePolicy = value; getFormManager ().fireCodeChange (); } // ------------------------------------------------------------------------------ // End of form synthetic properties protected Node.Property[] createSyntheticProperties () { if (!getFormManager ().getFormEditorSupport ().supportsAdvancedFeatures ()) { if ((formInfo instanceof JMenuBarContainer) || (formInfo instanceof MenuBarContainer)) { return new Node.Property[] { createMenuProperty () } ; } else { return new Node.Property[0]; } } Node.Property policyProperty = new PropertySupport.ReadWrite (PROP_FORM_SIZE_POLICY, Integer.TYPE, FormEditor.getFormBundle ().getString ("MSG_FormSizePolicy"), FormEditor.getFormBundle ().getString ("MSG_FormSizePolicy")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return new Integer (getFormSizePolicy ()); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Integer)) throw new IllegalArgumentException (); setFormSizePolicy (((Integer)val).intValue ()); } /** Editor for alignment */ public java.beans.PropertyEditor getPropertyEditor () { return new SizePolicyEditor (); } }; Node.Property sizeProperty = new PropertySupport.ReadWrite (PROP_FORM_SIZE, Dimension.class, FormEditor.getFormBundle ().getString ("MSG_FormSize"), FormEditor.getFormBundle ().getString ("MSG_FormSize")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return getFormSize (); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Dimension)) throw new IllegalArgumentException (); setFormSize ((Dimension)val); } }; Node.Property positionProperty = new PropertySupport.ReadWrite (PROP_FORM_POSITION, Point.class, FormEditor.getFormBundle ().getString ("MSG_FormPosition"), FormEditor.getFormBundle ().getString ("MSG_FormPosition")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return getFormPosition (); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Point)) throw new IllegalArgumentException (); setFormPosition ((Point)val); } }; Node.Property genPositionProperty = new PropertySupport.ReadWrite (PROP_GENERATE_POSITION, Boolean.TYPE, FormEditor.getFormBundle ().getString ("MSG_GeneratePosition"), FormEditor.getFormBundle ().getString ("MSG_GeneratePosition")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return new Boolean (getGeneratePosition ()); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Boolean)) throw new IllegalArgumentException (); setGeneratePosition (((Boolean)val).booleanValue ()); } }; Node.Property genSizeProperty = new PropertySupport.ReadWrite (PROP_GENERATE_SIZE, Boolean.TYPE, FormEditor.getFormBundle ().getString ("MSG_GenerateSize"), FormEditor.getFormBundle ().getString ("MSG_GenerateSize")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return new Boolean (getGenerateSize ()); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Boolean)) throw new IllegalArgumentException (); setGenerateSize (((Boolean)val).booleanValue ()); } }; Node.Property genCenterProperty = new PropertySupport.ReadWrite (PROP_GENERATE_CENTER, Boolean.TYPE, FormEditor.getFormBundle ().getString ("MSG_GenerateCenter"), FormEditor.getFormBundle ().getString ("MSG_GenerateCenter")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { return new Boolean (getGenerateCenter ()); } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof Boolean)) throw new IllegalArgumentException (); setGenerateCenter (((Boolean)val).booleanValue ()); } }; Node.Property genEncodingProperty = new EncodingProperty ("encoding", String.class, // NOI18N FormEditor.getFormBundle ().getString ("MSG_FormEncoding"), FormEditor.getFormBundle ().getString ("MSG_FormEncodingDesc")) { public void setValue (Object value) { if (!(value instanceof String)) { throw new IllegalArgumentException (); } getFormManager ().setEncoding ((String) value); } public Object getValue () { Object value = getFormManager ().getEncoding (); if (value == null) { value = ""; // NOI18N } return value; } }; // the order of if's is important, JAppletFormInfo implements // JMenuBarContainer if (formInfo instanceof JAppletFormInfo) { return new Node.Property[] { createMenuProperty(), genEncodingProperty, }; } else if (formInfo instanceof AppletFormInfo || formInfo instanceof PanelFormInfo || formInfo instanceof JPanelFormInfo) { return new Node.Property[] { genEncodingProperty, }; } else if (formInfo instanceof JMenuBarContainer || formInfo instanceof MenuBarContainer) { return new Node.Property[] { createMenuProperty(), sizeProperty, positionProperty, policyProperty, genPositionProperty, genSizeProperty, genCenterProperty, genEncodingProperty, }; } else { return new Node.Property[] { sizeProperty, positionProperty, policyProperty, genPositionProperty, genSizeProperty, genCenterProperty, genEncodingProperty, }; } } private Node.Property createMenuProperty () { return new PropertySupport.ReadWrite (PROP_MENU_BAR, String.class, FormEditor.getFormBundle ().getString ("MSG_MenuBar"), FormEditor.getFormBundle ().getString ("MSG_MenuBarDesc")) { public Object getValue () throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { String s = getFormMenu (); return (s == null) ? NO_MENU : s; } public void setValue (Object val) throws IllegalAccessException, IllegalArgumentException, java.lang.reflect.InvocationTargetException { if (!(val instanceof String)) throw new IllegalArgumentException (); String s = (String) val; setFormMenu(s.equals(NO_MENU) ? null : s); } /** Editor for alignment */ public java.beans.PropertyEditor getPropertyEditor () { return new FormMenuEditor (); } }; } ArrayList getAvailableMenus() { ArrayList list = new ArrayList(); RADComponent[] comps = getFormManager ().getNonVisualComponents (); int size = comps.length; boolean swing = (formInfo instanceof JMenuBarContainer); for (int i = 0; i < size; i++) { if (comps[i] instanceof RADMenuComponent) { RADMenuComponent n = (RADMenuComponent) comps[i]; if ((swing && (n.getMenuItemType () == RADMenuComponent.T_JMENUBAR)) || (!swing && (n.getMenuItemType () == RADMenuComponent.T_MENUBAR))) list.add (n); } } return list; } // ------------------------------------------------------------------------------------------ // Innerclasses final public static class SizePolicyEditor extends java.beans.PropertyEditorSupport { /** Display Names for alignment. */ private static final String[] names = { FormEditor.getFormBundle ().getString ("VALUE_sizepolicy_full"), FormEditor.getFormBundle ().getString ("VALUE_sizepolicy_pack"), FormEditor.getFormBundle ().getString ("VALUE_sizepolicy_none"), }; /** @return names of the possible directions */ public String[] getTags () { return names; } /** @return text for the current value */ public String getAsText () { int value = ((Integer)getValue ()).intValue (); return names[value]; } /** Setter. * @param str string equal to one value from directions array */ public void setAsText (String str) { if (names[0].equals (str)) setValue (new Integer (0)); else if (names[1].equals (str)) setValue (new Integer (1)); else if (names[2].equals (str)) setValue (new Integer (2)); } } final public class FormMenuEditor extends java.beans.PropertyEditorSupport { /** @return names of the possible directions */ public String[] getTags () { ArrayList list = getAvailableMenus (); RADComponent[] comps = new RADComponent [list.size ()]; list.toArray (comps); String[] names = new String[comps.length + 1]; names[0] = NO_MENU; // No Menu for (int i = 0; i < comps.length; i++) { names[i+1] = comps[i].getName (); } return names; } /** @return text for the current value */ public String getAsText () { return (String)getValue (); } /** Setter. * @param str string equal to one value from directions array */ public void setAsText (String str) { setValue (str); } } abstract class EncodingProperty extends PropertySupport.ReadWrite { EncodingProperty (String name, Class type, String displayName, String shortDescription) { super (name, type, displayName, shortDescription); } /** Editor with list of encodings */ public java.beans.PropertyEditor getPropertyEditor () { return new EncodingEditor (); } class EncodingEditor extends java.beans.PropertyEditorSupport implements EnhancedPropertyEditor { /** * @return true if this PropertyEditor provides a enhanced in-place custom * property editor, false otherwise */ public boolean hasInPlaceCustomEditor () { return true; } public void setAsText (String value) { String newValue = (String) encodingList.get (value); if (newValue == null) newValue = value; // XXX(-tdt) test if the encoding is supported by the JDK try { String x = new String(new byte[0], 0, 0, newValue); } catch (java.io.UnsupportedEncodingException ex) { throw new IllegalArgumentException( FormEditor.getFormBundle().getString("ERR_UnsupportedEncoding")); } setValue (newValue); if (!getFormManager ().getFormObject ().isModified ()) { getFormManager ().getFormObject ().setModified (true); } } public String getAsText () { return getValue ().toString (); } public java.awt.Component getInPlaceCustomEditor () { final JComboBox eventBox = new JComboBox (); eventBox.setEditable(true); java.util.Iterator iter = encodingList.keySet().iterator(); while (iter.hasNext()) eventBox.addItem(iter.next()); eventBox.setSelectedItem(getAsText()); eventBox.addActionListener (new java.awt.event.ActionListener () { public void actionPerformed (java.awt.event.ActionEvent e) { try { setAsText((String) eventBox.getEditor().getItem()); } catch (IllegalArgumentException ex) { TopManager.getDefault().notify(new NotifyDescriptor.Message( ex.getMessage(), NotifyDescriptor.ERROR_MESSAGE)); } } } ); return eventBox; } /** * @return true if this property editor provides tagged values and * a custom strings in the choice should be accepted too, false otherwise */ public boolean supportsEditingTaggedValues () { return false; } } } } /* * Log * 27 Gandalf-post-FCS1.24.1.1 3/20/00 Tran Duc Trung * 26 Gandalf-post-FCS1.24.1.0 3/20/00 Tran Duc Trung FIX #6008: don't * generate resize code for applet and panel * 25 Gandalf 1.24 1/13/00 Ian Formanek NOI18N #2 * 24 Gandalf 1.23 1/12/00 Pavel Buzek I18N * 23 Gandalf 1.22 1/11/00 Pavel Buzek * 22 Gandalf 1.21 1/10/00 Pavel Buzek #5088 * 21 Gandalf 1.20 1/5/00 Ian Formanek NOI18N * 20 Gandalf 1.19 12/14/99 Pavel Buzek * 19 Gandalf 1.18 12/13/99 Pavel Buzek * 18 Gandalf 1.17 11/24/99 Pavel Buzek list of encodings for * Encoding property, editor changed to combo box * 17 Gandalf 1.16 11/15/99 Pavel Buzek property for encoding * 16 Gandalf 1.15 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 15 Gandalf 1.14 10/9/99 Ian Formanek Fixed bug 4045 - * Exception while opening form with menus. The form did not open due to * this exception. * 14 Gandalf 1.13 9/29/99 Ian Formanek codeChanged added to * FormListener * 13 Gandalf 1.12 8/15/99 Ian Formanek getContainerGenName * usage clarified * 12 Gandalf 1.11 7/30/99 Ian Formanek Fixed bugs 2915 - * Changing "viewport" property of the JScrollPane does not work - * "Property" and 2916 - Changing "viewport" property of the JScrollPane * does not work - "Method Call" * 11 Gandalf 1.10 7/25/99 Ian Formanek Variables management * moved to RADComponent * 10 Gandalf 1.9 7/14/99 Ian Formanek synthetic "menu" * property does not require supportsAdvancedFeatures () to return true in * the current persistence manager * 9 Gandalf 1.8 7/11/99 Ian Formanek Some synthetic * properties are available only if supportsAdvancedFeatures of current * persistence manager returns true * 8 Gandalf 1.7 7/9/99 Ian Formanek Fixed setting "No Menu" * 7 Gandalf 1.6 7/9/99 Ian Formanek menu editor improvements * 6 Gandalf 1.5 7/5/99 Ian Formanek menu bar property, * constants for properties * 5 Gandalf 1.4 6/25/99 Ian Formanek Improved Size Policy * 4 Gandalf 1.3 6/24/99 Ian Formanek Generation of size for * visaul forms * 3 Gandalf 1.2 6/6/99 Ian Formanek New FormInfo design * employed to provide correct top-level bean properties * 2 Gandalf 1.1 5/11/99 Ian Formanek Build 318 version * 1 Gandalf 1.0 5/10/99 Ian Formanek * $ */